package platform.util;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.InvocationTargetException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.TreeMap;

import javax.servlet.ServletContext;

import net.sf.cglib.beans.BeanGenerator;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
public class Util {
	private static final Logger log = Logger.getLogger(Util.class);
	/**
	 * 
	 * <br/>方法描述: 根据类路径创建实例
	 * @param url 类路径
	 * @return
	 * @throws Exception
	 */
	public static Object createObject(String url)throws Exception{
		Object o = (Object)Class.forName(url).newInstance();
		return o;
	}
	/**
	 * 
	* 方法功能描述:将double类型转换为指定格式
	@param pattern:两位小数"0.00"  三位小数"0.000"
	@param source
	@return
	* @author guotingting
	* @created date  Jun 1, 2010
	 */
	public static String formatData(String pattern, double source) {
		DecimalFormat df = new DecimalFormat(pattern);
		return df.format(source);
}
	/**
	 * 
	 * <br/>方法描述:将字符串转化为double类型 （默认值为 0.0）
	 * @param o 需要转化的字符串对象
	 * @return double 数字
	 */
	public static double todouble(Object o){
		if(o!=null){
			return Double.parseDouble(o.toString());
		}else{
			return 0.0;
		}
	}
	/**
	 * 
	 * <br/>方法描述:将字符串转化为long类型 （默认值为 0）
	 * @param o 需要转化的字符串对象
	 * @return long 数字
	 */	
	public static long tolong(Object o){
		if(o!=null){
			return Long.parseLong(o.toString());
		}else{
			return 0;
		}
	}
	/**
	 * 
	 * <br/>方法描述:将字符串转化为int类型 （默认值为 0）
	 * @param o 需要转化的字符串对象
	 * @return int 数字
	 */		
	public static int toint(Object o){
		if(o!=null){
			return Integer.parseInt(o.toString());
		}else{
			return 0;
		}
	}
	/**
	 * 
	 * <br/>方法描述:判断对象是否为空
	 * @param o 检测的对象
	 * @return true 表示为空  false 表示不为空
	 */			
	public static boolean isNull(Object o) {
		if (o == null || "".equals(o) || "null".equals(o)) {
			return true;
		}else{
			return false;
		}
	}
	/**
	 * 
	 * <br/>方法描述:字符编码转换：从iso转化成Utf8
	 * @param source  源字符串
	 * @return 编码后的字符串
	 */			
	public static String isoToUtf8(String source) {
		String target = "";
		try {
			target = new String(source.getBytes("iso-8859-5"), "utf-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return target;
	}
	/**
	 * 
	 * <br/>方法描述:字符编码转换：从iso转化成GBK
	 * @param source  源字符串
	 * @return 编码后的字符串
	 */			
	public static String isoToGBK(String source) {
		String target = "";
		try {
			target = new String(source.getBytes("iso-8859-5"), "GBK");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return target;
	}
	/**
	 * 
	 * <br/>方法描述:字符编码转换：从iso转化成GB2312
	 * @param source  源字符串
	 * @return 编码后的字符串
	 */	
	public static String isoToGB2312(String source) {
		String target = "";
		try {
			target = new String(source.getBytes("iso-8859-5"), "gb2312");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return target;
	}
	/**
	 * 
	 * <br/>方法描述: 基于map 动态创建bean
	 * @param queryMap  查询属性封装 eg ： {eqName :int} 
	 * @return
	 */
	public static Object createDynamicBean(Map  queryMap) {
	  Iterator iterQuery= queryMap.keySet().iterator();//初始化bean 主要是处理int  double的默认值
	  BeanGenerator bg = new BeanGenerator(); //基于配置信息，利用cglib，动态创建类
	  Map defaltSetMap=new HashMap();//处理int  double 因为基于cglib，创建bean的时候，会自动赋值为0 
	  while(iterQuery.hasNext()){
	    	String key=(String)iterQuery.next();
			String name=key;
			String type=((String)queryMap.get(key)).toLowerCase();
			if("int".equals(type)){
				bg.addProperty(name, Integer.TYPE);
				defaltSetMap.put(name, new Integer(-111111));//设置-111111， 作为整型的默认值
				continue;
			}
			if("double".equals(type)){
				bg.addProperty(name, Double.TYPE);
				defaltSetMap.put(name, new Integer(-222222));//设置-222222， 作为浮点型的默认值
				continue;
			}
			if("string".equals(type)){
				bg.addProperty(name, String.class);
				continue;
			}
			if("list".equals(type)){
				bg.addProperty(name, Collection.class);
				continue;
			}			
	    }
	   Object bean = bg.create();//动态创建查询对象实例
	   Iterator iter= defaltSetMap.keySet().iterator();//初始化bean 主要是处理int  double的默认值
	   while(iter.hasNext()){
		   String key=(String)iter.next();
		   try {
			   PropertyUtils.setProperty(bean, key, defaltSetMap.get(key));
		   } catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			   e.printStackTrace();
		   } catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			   e.printStackTrace();
		   } catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			   e.printStackTrace();
		   }
	   	}
	   return bean;
   }
	/**
	 * 
	 * <br/>方法描述: 依照指定属性集合排序 
	 * @param collection 需要排序的集合
	 * @param sortCol     排序字段
	 * @param isAsc       true 升序  false 降序
	 * @return
	 */
	public static List sortCollection(List collection,String sortCol, boolean isAsc) {
		for (int i = 0; i < collection.size(); i++) {
			for (int j = i + 1; j < collection.size(); j++) {
				BeanWrapper bwi=new BeanWrapperImpl(collection.get(i));
				BeanWrapper bwj=new BeanWrapperImpl(collection.get(j));
				int  leftI=(Integer)bwi.getPropertyValue(sortCol);
				int  leftJ=(Integer)bwj.getPropertyValue(sortCol);
				if (isAsc) {
					if ( leftI>leftJ) {
						Object obj = collection.get(j);
						collection.set(j, collection.get(i));
						collection.set(i, obj);
					}
				} else {
					if ( leftI<leftJ) {
						Object obj = collection.get(j);
						collection.set(j, collection.get(i));
						collection.set(i, obj);
					}
				}
			}
		}
		return collection;
	}
	/**
	 * 
	 * <br/>方法描述: 解析配置文件 ，得到的是一个Map 配置文件的写法如下: 
	 * priceRule.subject.type.size=3
	 * priceRule.subject.type.0=0,\u5206\u652f\u79d1\u76ee
	 * priceRule.subject.type.1=1,\u586b\u62a5\u79d1\u76ee
	 * priceRule.subject.type.2=2,\u5206\u644a\u79d1\u76ee
	 * 
	 * @param fileName
	 *            要解析的文件全名，没有后缀名
	 * @param key
	 *            表示大小的key
	 * @return map
	 */
	public static Map<String, String> parsePropertiesReturnMap(String fileName,
			String key) {
		Map<String, String> map = new TreeMap<String, String>();
		ResourceBundle rb = ResourceBundle.getBundle(fileName);
		String value = rb.getString(key);
		int count = 0;
		if (null != value) {
			count = Integer.parseInt(value);
		}
		for (int i = 0; i < count; i++) {
			String subKey = key.replaceAll("size", (i + ""));
			map.put(rb.getString(subKey).split(",")[0], rb.getString(subKey).split(",")[1]);
		}
		return map;
	}
	
	/**
	 * 
	 * <br/>方法描述: 解析出配置文件。返回一个str
	 * @param fileName 要解析的文件全名，没有后缀名
	 * @param key key
	 * @return string
	 */
	public static String parsePropertiesReturnStr(String fileName , String key){
		ResourceBundle rb = ResourceBundle.getBundle(fileName);
		return rb.getString(key);
	}
	
	/**
	 * 获取bean工厂中的实例
	 */
	public static Object getService(String service,ServletContext setvletContext) {
		WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(setvletContext);
		return wac.getBean(service);

	}
	
	/**
	 * 只获取类名
	 */
	public  static String getSimpleName(Class<?> c)
	{
		String name = c.getName();
		if(name.indexOf("$$")!=-1){
			name = name.substring(0,name.indexOf("$$"));
		}
		name = name.substring(name.lastIndexOf(".")+1);
		return name;
	}
	
		/**
	 * 
	 * <br/>方法描述: 解析配置文件 ，得到的是一个List 配置文件的写法如下: 
	 * priceRule.subject.type.size=3
	 * priceRule.subject.type.0=0,\u5206\u652f\u79d1\u76ee
	 * priceRule.subject.type.1=1,\u586b\u62a5\u79d1\u76ee
	 * priceRule.subject.type.2=2,\u5206\u644a\u79d1\u76ee
	 * 
	 * @param fileName
	 *            要解析的文件全名，没有后缀名
	 * @param key
	 *            表示大小的key
	 * @return list
	 */
	public static List<PropertiesItem> parsePropertiesReturnList(String fileName,
			String key) {
		List<PropertiesItem> list = new ArrayList<PropertiesItem>();
		ResourceBundle rb = ResourceBundle.getBundle(fileName);
		String value = rb.getString(key);
		int count = 0;
		if (null != value) {
			count = Integer.parseInt(value);
		}
		for (int i = 0; i < count; i++) {
			String subKey = key.replaceAll("size", (i + ""));
			PropertiesItem item=new PropertiesItem();
			item.setId(rb.getString(subKey).split(",")[0]);
			item.setName(rb.getString(subKey).split(",")[1]);
			list.add(item);
		}
		return list;
	}
}
